package com.longyb.mylive.server.jt1078;

import cn.hutool.core.util.NumberUtil;
import io.netty.buffer.ByteBuf;
import lombok.Data;
import org.checkerframework.checker.units.qual.A;

import java.util.HashMap;
import java.util.Map;

/**
 * TODO
 *
 * @author chengxuwei
 * @date 2024-04-25
 * @since 1.0.0
 */
@Data
public class RTP {
  //----------- 16字节头-----------


  /**
   * 每一个 RTP 包中都有前 12 个字节，而 CSRC identifier 列表仅在 Mixer 插入时才有。
   * P 代表填充位，填多少由
   */


  public static final Map<Integer,String> typeMap=new HashMap<>();

  public static final Map<Integer,String> packMap=new HashMap<>();
//  0     没有定义
//  1-23  NAL单元  单个 NAL 单元包.
//    24    STAP-A   单一时间的组合包
//  25    STAP-B   单一时间的组合包
//  26    MTAP16   多个时间的组合包
//  27    MTAP24   多个时间的组合包
//  28    FU-A 分片的单元
//  29    FU-B     分片的单元
//  30-31 没有定义
  public static String getPackType(Integer n){
    String  msg="";
    if(n==0){
      msg="没有定义："+n;
    }
    if(n>=1&& n<=23){
      msg="NAL单元  单个 NAL 单元包";
    }
    if(n==24){
      msg="STAP-A   单一时间的组合包";
    }
    if(n==25){
      msg="STAP-B   单一时间的组合包";
    }
    if(n==26){
      msg="MTAP16   多个时间的组合包";
    }
    if(n==27){
      msg="MTAP24   多个时间的组合包";
    }
    if(n==28){
      msg="FU-A 分片的单元";
    }
    if(n==29){
      msg="FU-B     分片的单元";
    }
    if(n>29){
      msg="没有定义："+n;
    }

    return msg;
  }

  public static String getPlayType(Integer n){
    String msg = null;
    if(n<=34){
      msg=typeMap.get(n);
    }
    if(n>=35&&n<=71){
      msg="Unassigned:"+n;
    }
    if(n>=72&&n<=76){
      msg="Reserved for RTCP conflict avoidance:"+n;
    }
    if(n>=77&&n<=95){
      msg="Unassigned:"+n;
    }
    if(n>=96&&n<=127){
      msg="dynamic:"+n;
    }
    return msg;
    
  }
  
  static {



    typeMap.put(0	,"PCMU	A	8000	1	[RFC3551] ");
    typeMap.put(1	,"Reserved	 	 	 	  ");
    typeMap.put(2	,"Reserved	 	 	 	  ");
    typeMap.put(3	,"GSM	A	8000	1	[RFC3551] ");
    typeMap.put(4	,"G723	A	8000	1	[Vineet_Kumar][RFC3551] ");
    typeMap.put(5	,"DVI4	A	8000	1	[RFC3551] ");
    typeMap.put(6,"DVI4	A	16000	1	[RFC3551] ");
    typeMap.put(7	,"LPC	A	8000	1	[RFC3551] ");
    typeMap.put(8,"PCMA	A	8000	1	[RFC3551] ");
    typeMap.put(9	,"G722	A	8000	1	[RFC3551] ");
    typeMap.put(10	,"L16	A	44100	2	[RFC3551] ");
    typeMap.put(11	,"L16	A	44100	1	[RFC3551] ");
    typeMap.put(12	,"QCELP	A	8000	1	[RFC3551] ");
    typeMap.put(13	,"CN	A	8000	1	[RFC3389] ");
    typeMap.put(14	,"MPA	A	90000	 	[RFC3551][RFC2250] ");
    typeMap.put(15	,"G728	A	8000	1	[RFC3551] ");
    typeMap.put(16	,"DVI4	A	11025	1	[Joseph_Di_Pol] ");
    typeMap.put(17	,"DVI4	A	22050	1	[Joseph_Di_Pol] ");
    typeMap.put(18	,"G729	A	8000	1	[RFC3551] ");
    typeMap.put(19	,"Reserved	A	 	 	  ");
    typeMap.put(20	,"Unassigned	A	 	 	  ");
    typeMap.put(21	,"Unassigned	A	 	 	  ");
    typeMap.put(22	,"Unassigned	A	 	 	  ");
    typeMap.put(23	,"Unassigned	A	 	 	  ");
    typeMap.put(24	,"Unassigned	V	 	 	  ");
    typeMap.put(25	,"CelB	V	90000	 	[RFC2029] ");
    typeMap.put(26	,"JPEG	V	90000	 	[RFC2435] ");
    typeMap.put(27	,"Unassigned	V	 	 	  ");
    typeMap.put(28	,"nv	V	90000	 	[RFC3551] ");
    typeMap.put(29	,"Unassigned	V	 	 	  ");
    typeMap.put(30	,"Unassigned	V	 	 	  ");
    typeMap.put(31,"H261	V	90000	 	[RFC4587] ");
    typeMap.put(32,"MPV	V	90000	 	[RFC2250] ");
    typeMap.put(33,"MP2T	AV	90000	 	[RFC2250] ");
    typeMap.put(34,"H263	V	90000	 	[Chunrong_Zhu] ");
    typeMap.put(96,"h264");
    typeMap.put(97,"h264");
    typeMap.put(98,"h264");
    typeMap.put(99,"h264");
//    35-71	Unassigned	?
//    72-76	Reserved for RTCP conflict avoidance	 	 	 	[RFC3551]
//    77-95	Unassigned	?
//    96-127	dynamic
  }
  /**
   *   1byte
   */

  private Integer flag;
  private Integer fV;
  private Integer fP; //填充位
  private Integer fX; //定长头字段后面会有一个扩展头。扩展头放在CSRC之后
  /**
   *  CSRC count 标识了定长头字段中包含的 CSRC identifier 的数量; 值为零，没有CSRC
   *  fCC==0,且fX=0 ；只有12byte 头
   */
  private Integer fCC;

  /**
   *   1byte
   */

  private Integer data;
  private Integer dM;
  /**
   * https://blog.csdn.net/xionglifei2014/article/details/121360988
   * h264=96
   *
   */
  private Integer dPT;
  /**
   *   2byte
   */

  private Integer seq;
  /**
   * 4Byte
   */
  private Integer timestamp;
  /**
   * 4byte
   */
  private Integer ssrc;
  /**
   * 4byte
   */
  private Integer csrc;

  //------------数据--------------------
  /**
   *
   * https://blog.csdn.net/m0_60259116/article/details/124849922
   * https://blog.csdn.net/KayChanGEEK/article/details/102489526
   * 1.单个 NAL 单元包
   * 2.聚合包 STAP-A 、STAP-B格式
   * 3.分片单元（FU-A、FU-B）
   */
  private Integer pFlag;
  private Integer pF;
  private Integer pNRI;
  /**
   0 没有定义
   1-23 NAL单元 单个 NAL 单元包.
   24 STAP-A 单一时间的组合包
   25 STAP-B 单一时间的组合包
   26 MTAP16 多个时间的组合包
   27 MTAP24 多个时间的组合包
   28 FU-A 分片的单元
   29 FU-B 分片的单元
   30-31 没有定义
   */

  private Integer pType;


  /**
   * RTP header中的“X”位如果置“1”, 则表示该header含有扩展信息. 扩展信息回存放在正常header尾部位置.
   *
   * profile : 占2个字节
   * profile值为0xBE、0xDE, 说明扩展项的ID和len占1个字节, 即ID占4位 length占4位
   * profile值为0x10、0x0X(“X”表示任意数, 一般为“0”, 即0x00), 说明扩展项的ID和len占2个字节, 即ID占8位 length占8位
   * length : 表示后面跟着的扩展头信息有几个字节
   * 扩展头长度以4字节为单位
   * 例如: length = 3, 说明扩展头长度占12字节
   * https://zhuanlan.zhihu.com/p/557859851
   */
  private ByteBuf media;

}
